package com.bruce.pattern.creational.singleton;

import lombok.extern.slf4j.Slf4j;

/**
 * <pre>
 * 静态内部类的方式实现懒汉式单例模式 -- 基于类初始化的延迟加载解决方案
 *
 * jvm在类class的初始化阶段,(也就是class被加载后,被线程使用之前)会执行类class的初始化,
 * 在类class初始化阶段,jvm会去获取一个锁,用于同步多个线程对类class的初始化
 * 根据java语言规范,主要以下几种会立刻初始化类class
 *  1 实例对象被创建
 *  2 类中的静态方法被调用
 *  3 类中静态成员被赋值
 *  4 类中的静态成员被使用,并且不是一个常量成员
 *  5 如果是一个顶级类,类中有嵌套的断言语句
 * </pre>
 * Created by bruce on 2018/11/3 0:16
 */
@Slf4j
public class StaticInnerClassSingleton {

    private static class InnerClass {
        private static StaticInnerClassSingleton staticInnerClassSingleton = new StaticInnerClassSingleton();
    }

    private StaticInnerClassSingleton(){
        if (InnerClass.staticInnerClassSingleton != null){
            throw new RuntimeException("单例构造器禁止反射");
        }
        log.info("StaticInnerClassSingleton is create");
    }

    public static StaticInnerClassSingleton getInstance(){
        return InnerClass.staticInnerClassSingleton;
    }


}
